package Learn;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.TreeMap;

public class TreeMapDemo1 {
    //底层跟TreeSet一样 红黑树  键
    //对键进行排序

    //比较方法 实现Comparable接口
    //         创建集合时使用Comparator比较器对象 指定比较规则

    public static void main(String[] args) {
//        TreeMap<Integer,String> map=new TreeMap<>(new Comparator<Integer>() {
//            @Override
//            public int compare(Integer o1, Integer o2) {
//                return o2-o1;
//            }
//        });
//        map.put(1,"a");
//        map.put(2,"b");
//        map.put(3,"c");
//        map.put(4,"d");
//        System.out.println(map);

        ArrayList<String> list=new ArrayList<>();
        Collections.addAll(list,"abc","qwer,","shift");
        System.out.println(list);

        Collections.shuffle(list);
        System.out.println(list);
    }


    //底层原理
    //put  参数 键 值 （键值重复时是否需要覆盖 true 覆盖 false 不覆盖）
    //第三个参数跟HashMap的不一样 是因为判断逻辑不一样

    //看源码
    //在创建TreeMap对象的时候 可以是空参创建 也可以传参（传的是比较器的实现类对象）
    //在树存储元素进行判断时 会将Key（键）强转成比较器实现类类型
    //如果你的自定义键的类里没有实现Comparable 接口 那么强转时会报错
    //强转成Comparable类
    // 这里是接口的多态,强转可以省略,因为自定义类实现了这里接口且重写方法,所以向上转型可以保证只用接口里被重写过后的方法



    //TreeMap添加元素时不需要重写 hashCode和equals方法
    //因为TreeMap不是HashMap 底层用的是树不是哈希表 所以用不到这两个方法 不用重写

    //HashMap底层使用数组链表 红黑树 但是HashMap的键不需要实现Comparable接口 或者传递比较器类对象
    //因为哈希表 默认是使用哈希值的大小来创建红黑树的

    //TreeMap和HashMap效率问题 一般来说HashMap效率更高 但是如果HashMap里面元素多了形成了链表
    // 那么这时Tree Map效率比HashMap效率高

    //Java提供了不会覆盖Key的put方法
    //PutIfAbsent  不常用
    //有Boolean类型的变量可以控制两面性的 一般都有AB两面
    //int类型的变量 一般可以控制三面及以上

    //三种Map选择
    //默认用HashMap 效率高
    //存取有序 LInkedHashMap
    //进行排序 TreeMap

    //可变参数 只能写一个可变参数
    //         如果有其他参数 可变参数要放到最后
    //底层是数组 Java创建好的数组

    //Collections不是集合 是集合的工具类
    //常用APi  addAll 集合批量添加

    //shuffle 打乱集合里的元素



}
